package com.monkarapps.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.MethodExpressionActionListener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;

import com.monkarapps.bean.Categoria;
import com.monkarapps.bean.General;
import com.monkarapps.bean.Opcion;
import com.monkarapps.bean.Sub_categoria;
import com.monkarapps.bean.Usuario;
import com.monkarapps.service.CategoriaImplementacion;


@ManagedBean
@SessionScoped
public class CategoriaBB implements Serializable{
	
	
	 /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Categoria categoria;
	 private List<Categoria> listaCategorias = new ArrayList<Categoria>();
	 
	 private List<General> listaCategorias_top = new ArrayList<General>();
	 
	
	 
	 private MenuModel menuFavoritos = new DefaultMenuModel();
	 private MenuModel menuCategorias = new DefaultMenuModel();
	 
	 
	 private CategoriaImplementacion categoriai;
	 ExternalContext G = FacesContext.getCurrentInstance().getExternalContext();
	 HttpSession session = (HttpSession) G.getSession(true);
	 
	 public CategoriaBB(){
		 categoria = new Categoria();
		 categoriai= new CategoriaImplementacion();
		 
		 System.out.println("entro a categoriaBB");
		 
		 crearMenuDeCategorias();
		 crearMenuFavoritos();
		 
	 }
	 
	 
	


	private void crearMenuDeCategorias(){
		listaCategorias = listarCategorias();
	    for(Categoria c:listaCategorias){
	    	
	    	Submenu submenu = new Submenu();  
		    submenu.setLabel(c.getNombre());  
		    submenu.setId("sub"+c.getNombre());
		    
		    for(Sub_categoria sc: c.getSub_categorias()){
		    	MenuItem item = new MenuItem();  
		        item.setValue(sc.getNombre());  
		        ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
		        MethodExpression methodExpression = 
		        		factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), 
		        				"#{aplicacionBB.filtrar_"+sc.getNombre()+"}", String.class, new Class[]{});
		        item.setActionExpression(methodExpression);
		        item.setUpdate(":frm_center_center,:growl");
		        item.setId("op"+sc.getNombre());
		        submenu.getChildren().add(item);
		    }
	        menuCategorias.addSubmenu(submenu);  
	    }
	 }
	 private void crearMenuFavoritos(){
		listaCategorias_top =listarCategoriasTop();
	    Submenu submenu2 = new Submenu();  
	    submenu2.setLabel("Favoritos");
	    int x = ((int) Math.random() * 100); 
	    System.out.println("X ES :"+x);
	    int numeroAleatorio = (int) (Math.random()*25+1);
	    System.out.println("numeroAleatorio ES :"+numeroAleatorio);
	    submenu2.setId("subFavoritos"+x+""+numeroAleatorio);
	    for(General g:listaCategorias_top){
	    	
		    	MenuItem item = new MenuItem();  
		        item.setValue(g.getValor1());  
		        
		        ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
		        MethodExpression methodExpression = 
		        		factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), 
		        				"#{aplicacionBB."+g.getValor2()+"}", String.class, new Class[]{});
//		        MethodExpressionActionListener actionListener = new MethodExpressionActionListener(methodExpression);
//		        item.addActionListener(actionListener);
		        item.setActionExpression(methodExpression);
		        item.setUpdate(":frm_center_center,:growl");
		        item.setId(g.getValor3());
		        submenu2.getChildren().add(item);
	        
	    }
	    menuFavoritos.addSubmenu(submenu2); 
	   
	 }

	 
	 
	 
	 private List<General> listarCategoriasTop(){
	       List<General> lista = new ArrayList<General>();
			try {
				General c1 = new General();
				c1.setValor1("Mas Descargados");
				c1.setValor2("listarMasDescargados()");
				c1.setValor3("opMasDescargados");
				
				General c2 = new General();
				c2.setValor1("Mejor Valorados");
				c2.setValor2("listarMejorValorados()");
				c2.setValor3("opMenuMejorValorados");
				
				General c3 = new General();
				c3.setValor1("Del Momento");
				c3.setValor2("listarDelMomento()");
				c3.setValor3("opDelMomento");
				lista.add(c1);
				lista.add(c2);
				lista.add(c3);
				
				
			} catch (Exception e) {
				e.printStackTrace();
			}
	       return lista;
		 }
	 
	 private List<Categoria> listarCategorias(){
       List<Categoria> list;
		try {
			list = categoriai.listar();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			list = null;
		}
       return list;
	 }
	 






	public Categoria getCategoria() {
		return categoria;
	}



	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}



	public List<Categoria> getListaCategorias() {
		return listaCategorias;
	}



	public void setListaCategorias(List<Categoria> listaCategorias) {
		this.listaCategorias = listaCategorias;
	}



	public MenuModel getMenuCategorias() {
		return menuCategorias;
	}



	public void setMenuCategorias(MenuModel menuCategorias) {
		this.menuCategorias = menuCategorias;
	}



	public List<General> getListaCategorias_top() {
		return listaCategorias_top;
	}



	public void setListaCategorias_top(List<General> listaCategorias_top) {
		this.listaCategorias_top = listaCategorias_top;
	}



	public MenuModel getMenuFavoritos() {
		return menuFavoritos;
	}



	public void setMenuFavoritos(MenuModel menuFavoritos) {
		this.menuFavoritos = menuFavoritos;
	}


	public ExternalContext getG() {
		return G;
	}





	public void setG(ExternalContext g) {
		G = g;
	}





	public HttpSession getSession() {
		return session;
	}





	public void setSession(HttpSession session) {
		this.session = session;
	}

	
	 
	 
	 
}
